package com.mianle.userapi.util;

import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.codec.binary.Base64;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;


/**
 * simple introduction
 * <p>
 * <b>创建日期：</b> 2018年3月28日
 * </p>
 * 
 * @author heaixia
 * @since 0.0.1
 */
public class CpsUtil {

//	private static final Logger logger = LoggerFactory.getLogger(CpsUtil.class);

	/**
	 * SHA-1加密
	 * 
	 * @param s
	 * @return
	 */
	public static String encodeWithSha1(String s) {
		if (StringUtils.isEmpty(s)) {
			return "";
		}
		MessageDigest digest = null;
		try {
			digest = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}

		if(digest != null) {
			digest.update(s.getBytes());
			byte[] b = digest.digest();
			StringBuffer encode = new StringBuffer();
			for (int i = 0; i < b.length; i++) {
				String shaHex = Integer.toHexString(b[i] & 0xFF);
				if (shaHex.length() < 2) {
					encode.append(0);
				}
				encode.append(shaHex);
			}
			return encode.toString();
		}
		return "";
	}

	/**
	 * 公共加密函数
	 * 
	 * @param s
	 * @return
	 */
	public static String encode(String s) {
		if (StringUtils.isEmpty(s)) {
			return "";
		}
		return Base64.encodeBase64URLSafeString(s.getBytes());
	}

	/**
	 * 公共解密函数
	 * 
	 * @param s
	 * @return
	 */
	public static String decode(String s) {
		if (StringUtils.isEmpty(s)) {
			return "";
		}
		return new String(Base64.decodeBase64(s));
	}

	/**
	 * 将手机号转换成用于前台展现的形式
	 * 
	 * @param mobile
	 *            手机号，如：13587651234
	 * @return 形如 135****1234 的手机号
	 * @author hemingwang
	 */
	public static String showMobile(String mobile) {
		return hideSensitiveData(mobile, 3, 7);
	}

	/**
	 * 将邮箱转换成用于前台展现的形式
	 * 
	 * @param email
	 *            邮箱，如：182012345@qq.com
	 * @return 形如 182******@qq.com 的邮箱
	 * @author hemingwang
	 */
	public static String showEmail(String email) {
		if (StringUtils.isEmpty(email)) {
			return email;
		}
		int idx = email.indexOf('@');
		if (idx < 0) {
			return email;
		}
		String prefix = email.substring(0, idx);
		if (prefix.length() > 3) {
			prefix = prefix.substring(0, 3);
		}
		return prefix + "******" + email.substring(idx);
	}

	/**
	 * 将身份证号转换成用于前台展现的形式
	 * 
	 * @param cardId
	 *            身份证号，如：430221199010011234
	 * @return 形如 430221********1234 的身份证号
	 * @author hemingwang
	 */
	public static String showCardId(String cardId) {
		return hideSensitiveData(cardId, 6, -4);
	}

	/**
	 * 将真实姓名转换成用于前台展现的形式
	 * 
	 * @param realname
	 *            真实姓名，如：何明旺
	 * @return 形如 何** 的姓名
	 * @author hemingwang
	 */
	public static String showRealname(String realname) {
		if (StringUtils.isEmpty(realname)) {
			return realname;
		}
		return realname.substring(0, 1) + "**";
	}

	/**
	 * 隐藏字符串中的敏感数据
	 * 
	 * <pre>
	 * <code>
	 * CpsUtil.hideSensitiveData(null, *, *)    = null
	 * CpsUtil.hideSensitiveData("", * ,  *)    = "";
	 * CpsUtil.hideSensitiveData("13912345678", 3, 7)   = "139****5678"
	 * CpsUtil.hideSensitiveData("13912345678", 3, 0)   = "139********"
	 * CpsUtil.hideSensitiveData("13912345678", 3, -2)   = "139******78"
	 * CpsUtil.hideSensitiveData("13912345678", 8, 4)   = "13912345678"
	 * </code>
	 * </pre>
	 * 
	 * @param str
	 *            原字符串
	 * @param begin
	 *            敏感数据在 str 中的起始位置（从 0 开始），包含起始位置的字符
	 * @param end
	 *            敏感数据在 str 中的结束位置（从 0 开始），不包含结束位置的字符
	 *            <ul>
	 *            <li>大于 0 时， 表示敏感数据是在 begin 和 end 之间</li>
	 *            <li>等于 0 时，表示系数数据是从 begin 开始，到最后一个字符为止</li>
	 *            <li>小于 0 时，表示系数数据是从 begin 开始，到倒数第 end 个字符为止</li>
	 *            </ul>
	 * @return 敏感数据用 * 代替后的字符串
	 */
	public static String hideSensitiveData(String str, int begin, int end) {
		if (StringUtils.isEmpty(str)) {
			return str;
		}


		String prefix = "";
		String suffix = "";

		if (begin > 0) {
			prefix = StringUtils.substring(str, 0, begin);
		}

		if (end != 0) {
			suffix = StringUtils.substring(str, end);
		}

		int plaintextLength = prefix.length() + suffix.length();
		if (plaintextLength < str.length()) {
			return prefix + StringUtils.repeat('*', str.length() - plaintextLength) + suffix;
		}

		return str;
	}

	/**
	 * 生成指定区间的随机数
	 * 
	 * @param min
	 *            最小值
	 * @param max
	 *            最大值
	 * @return
	 */
	public static int randomInt(int min, int max) {
		return new Random().nextInt(max - min + 1) + min;
	}

}
